#define _GNU_SOURCE
#include "daemon_runner.h"
#include <unistd.h>
#include <fcntl.h>
#include <signal.h>
#include "daemon_sub_process.h"
#define SUB_PROCESS_COUNT 2
static int is_running = 1;
static sub_process_t *sub_process_list[SUB_PROCESS_COUNT];
void  daemon_runner_stop (int sig)
{
    is_running = 0;
}

/**
 * 守护进程运行
 * 
 * 1 守护模式（后台运行）
 * 2 把日志信息重定向到文件中
 * 3 注册信号  中断信号 终止信号
 * 4 初始化子进程 多个 
 * 5 循环检测、 启动子进程
 * 6 逐个销毁子进程
 */
int  daemon_runner_run()
{


    // * 1 守护模式（后台运行）
    daemon(0,1); //后台静默启动 不阻塞控制台
    // * 2 把日志信息重定向到文件中
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
    open("/root/gateway.log",O_CREAT|O_RDWR|O_APPEND,0666);//1
    open("/root/gateway.err",O_CREAT|O_RDWR|O_APPEND,0666) ;//2

    // * 3 注册信号  中断信号 终止信号
    signal( SIGTERM, daemon_runner_stop);
    // * 4 初始化子进程 多个  app  ota 
    sub_process_list[0] = daemon_sub_process_init("app");
    sub_process_list[1] = daemon_sub_process_init("ota");
    // * 5 循环检测、 启动子进程
    while(is_running)
    {
        for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
        {
             daemon_sub_process_check_and_start( sub_process_list[i]);
        }
        sleep(2);
    }
    // * 6 逐个销毁子进程

    for (size_t i = 0; i < SUB_PROCESS_COUNT; i++)
    {
        daemon_sub_process_destroy(sub_process_list[i]);
    }

    return 0;
}